package com.sssre.banner.utils;

/**
 * banner 打印工具类
 *
 * @author 浪兎兎
 * @since 2025-05-27-11:25
 */
public abstract class BannerUtil {
    /**
     * 元素 JavaBean
     */
    public static class Element{
        /** 颜色 */
        private Color color = Color.DEFAULT;
        /** 样式 */
        private Style style = Style.NORMAL;
        /** 背景颜色 */
        private BackgroundColor backgroundColor = BackgroundColor.DEFAULT;

        public Element(Color color, Style style, BackgroundColor backgroundColor) {
            this.color = color;
            this.style = style;
            this.backgroundColor = backgroundColor;
        }

        public Element() {
        }

        public Color getColor() {
            return color;
        }

        public void setColor(Color color) {
            this.color = color;
        }

        public Style getStyle() {
            return style;
        }

        public void setStyle(Style style) {
            this.style = style;
        }

        public BackgroundColor getBackgroundColor() {
            return backgroundColor;
        }

        public void setBackgroundColor(BackgroundColor backgroundColor) {
            this.backgroundColor = backgroundColor;
        }

        @Override
        public String toString() {
            return "Element: {" +
                    "color: " + color + "(" + color.code + ")" +
                    ", style: " + style + "(" + style.code + ")" +
                    ", backgroundColor: " + backgroundColor + "(" + backgroundColor.code + ")" +
                    '}';
        }

        public void setConsoleElement() {
            if (!color.code.equals("39")) System.out.println("\u001B[" + color.code + "m");
            if (!style.code.equals("0")) System.out.println("\u001B[" + style.code + "m");
            if (!backgroundColor.code.equals("49")) System.out.println("\u001B[" + backgroundColor.code + "m");
        }
    }

    /**
     * 颜色枚举类
     */
    public enum Color {
        /** 默认 */
        DEFAULT("39"),
        /** 黑色 */
        BLACK("30"),
        /** 红色 */
        RED("31"),
        /** 绿色 */
        GREEN("32"),
        /** 黄色 */
        YELLOW("33"),
        /** 蓝色 */
        BLUE("34"),
        /** 洋红色 */
        MAGENTA("35"),
        /** 青色 */
        CYAN("36"),
        /** 白色 */
        WHITE("37"),
        /** 亮黑色 */
        BRIGHT_BLACK("90"),
        /** 亮红色 */
        BRIGHT_RED("91"),
        /** 亮绿色 */
        BRIGHT_GREEN("92"),
        /** 亮黄色 */
        BRIGHT_YELLOW("93"),
        /** 亮蓝色 */
        BRIGHT_BLUE("94"),
        /** 亮洋红色 */
        BRIGHT_MAGENTA("95"),
        /** 亮青色 */
        BRIGHT_CYAN("96"),
        /** 亮白色 */
        BRIGHT_WHITE("97");

        private final String code;

        Color(String code) {
            this.code = code;
        }
    }

    /**
     * 样式枚举类
     */
    public enum Style {
        /** 默认 */
        NORMAL("0"),
        /** 粗体 */
        BOLD("1"),
        /** 小字 */
        FAINT("2"),
        /** 斜体 */
        ITALIC("3"),
        /** 下划线 */
        UNDERLINE("4");

        private final String code;

        Style(String code) {
            this.code = code;
        }
    }

    /**
     * 背景颜色枚举类
     */
    public enum BackgroundColor {
        /** 默认 */
        DEFAULT("49"),
        /** 黑色 */
        BLACK("40"),
        /** 红色 */
        RED("41"),
        /** 绿色 */
        GREEN("42"),
        /** 黄色 */
        YELLOW("43"),
        /** 蓝色 */
        BLUE("44"),
        /** 洋红色 */
        MAGENTA("45"),
        /** 青色 */
        CYAN("46"),
        /** 白色 */
        WHITE("47"),
        /** 亮黑色 */
        BRIGHT_BLACK("100"),
        /** 亮红色 */
        BRIGHT_RED("101"),
        /** 亮绿色 */
        BRIGHT_GREEN("102"),
        /** 亮黄色 */
        BRIGHT_YELLOW("103"),
        /** 亮蓝色 */
        BRIGHT_BLUE("104"),
        /** 亮洋红色 */
        BRIGHT_MAGENTA("105"),
        /** 亮青色 */
        BRIGHT_CYAN("106"),
        /** 亮白色 */
        BRIGHT_WHITE("107");

        private String code;

        BackgroundColor(String code) {
            this.code = code;
        }
    }

    /**
     * LOGO 类
     */
    public static class Logo {
        /** 猫猫 */
        public static final String CAT = "   /\\_/\\    ☆彡\n" +
                "  ( o.o )  > SSSRE %s ~\n" +
                "   > ^ <  /";
    }

    /**
     * 仅打印猫猫 LOGO
     */
    public static void printStartLogo () {
        System.out.println(String.format(Logo.CAT, ""));
    }

    /**
     * 打印猫猫 LOGO，并携带消息
     * @param msg 消息
     */
    public static void printStartLogo (String msg) {
        System.out.println(String.format(Logo.CAT, msg));
    }

    /**
     * 打印指定的 LOGO，并携带消息。如果是自定义logo，整个 logo 字符串有且仅有一个 %s。
     * @param logo LOGO
     * @param msg 消息
     */
    public static void printStartLogo (String logo, String msg) {
        System.out.println(String.format(logo, msg));
    }


    /**
     * 打印指定颜色猫猫 LOGO，并携带消息
     * @param color 颜色
     * @param msg 消息
     */
    public static void printStartLogo (Color color, String msg) {
        System.out.println("\u001B[" + color.code + "m");
        System.out.println(String.format(Logo.CAT, msg));
        System.out.println("\u001B[0m");
    }

    /**
     * 打印指定颜色的指定 LOGO，并携带消息。如果是自定义logo，整个 logo 字符串有且仅有一个 %s。
     * @param logo LOGO
     * @param color 颜色
     * @param msg 消息
     */
    public static void printStartLogo (Color color, String logo, String msg) {
        System.out.println("\u001B[" + color.code + "m");
        System.out.println(String.format(logo, msg));
        System.out.println("\u001B[0m");
    }

    /**
     * 打印指定样式猫猫 LOGO，并携带消息
     * @param element 样式
     * @param msg 消息
     */
    @Deprecated
    public static void printStartLogo (Element element, String msg) {
        element.setConsoleElement();
        System.out.println(String.format(Logo.CAT, msg));
        System.out.println("\u001B[0m");
    }

    /**
     * 打印指定样式的指定 LOGO，并携带消息。如果是自定义logo，整个 logo 字符串有且仅有一个 %s。
     * @param logo LOGO
     * @param element 样式
     * @param msg 消息
     */
    @Deprecated
    public static void printStartLogo (Element element, String logo, String msg) {
        element.setConsoleElement();
        System.out.println(String.format(logo, msg));
        System.out.println("\u001B[0m");
    }

    public static void main(String[] args) {
        System.out.println(new Element());
    }
}
